/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package utiles.datastructure;

import java.util.HashMap;

/**
 * Provides a hash map which is indexed by two keys. In fact this is just a hash
 * map which is indexed by a pair containing the two keys. The provided two-key
 * access methods try to increase code readability.
 *
 * @param <K1>
 *            First key
 * @param <K2>
 *            Second key
 * @param <V>
 *            Result value
 *
 * @author Ruediger Lunde
 * @author Mike Stampone
 */
public class TwoKeyHashMap<K1, K2, V> extends HashMap<Pair<K1, K2>, V> {
        private static final long serialVersionUID = -2232849394229644162L;

        /**
         * Associates the specified value with the specified key pair in this map.
         * If the map previously contained a mapping for this key pair, the old
         * value is replaced.
         *
         * @param key1
         *            the first key of the key pair, with which the specified value
         *            is to be associated.
         * @param key2
         *            the second key of the key pair, with which the specified value
         *            is to be associated.
         * @param value
         *            the value to be associated with the key pair.
         *
         */
        public void put(K1 key1, K2 key2, V value) {
                super.put(new Pair<K1, K2>(key1, key2), value);
        }

        /**
         * Returns the value to which the specified key pair is mapped in this two
         * key hash map, or <code>null</code> if the map contains no mapping for
         * this key pair. A return value of null does not <em>necessarily</em>
         * indicate that the map contains no mapping for the key; it is also
         * possible that the map explicitly maps the key to <code>null</code>. The
         * <code>containsKey</code> method may be used to distinguish these two
         * cases.
         *
         * @param key1
         *            the first key of the key pair, whose associated value is to be
         *            returned.
         * @param key2
         *            the second key of the key pair, whose associated value is to
         *            be returned.
         *
         * @return the value to which this map maps the specified key pair, or
         *         <code>null</code> if the map contains no mapping for this key
         *         pair.
         */
        public V get(K1 key1, K2 key2) {
                return super.get(new Pair<K1, K2>(key1, key2));
        }

        /**
         * Returns <code>true</code> if this map contains a mapping for the
         * specified key pair.
         *
         * @param key1
         *            the first key of the key pair whose presence in this map is to
         *            be tested.
         * @param key2
         *            the second key of the key pair whose presence in this map is
         *            to be tested.
         *
         * @return <code>true</code> if this map contains a mapping for the
         *         specified key.
         */
        public boolean containsKey(K1 key1, K2 key2) {
                return super.containsKey(new Pair<K1, K2>(key1, key2));
        }

        /**
         * Removes the mapping for this key pair from this map if present.
         *
         * @param key1
         *            the first key of the key pair, whose mapping is to be removed
         *            from the map.
         * @param key2
         *            the second key of the key pair, whose mapping is to be removed
         *            from the map.
         *
         * @return the previous value associated with the specified key pair, or
         *         <code>null</code> if there was no mapping for the key pair. A
         *         <code>null</code> return can also indicate that the map
         *         previously associated <code>null</code> with the specified key
         *         pair.
         */
        public V remove(K1 key1, K2 key2) {
                return super.remove(new Pair<K1, K2>(key1, key2));
        }

        // public static void main(String[] args) {
        // TwoKeyHashMap<String, String, String> hash = new TwoKeyHashMap<String,
        // String, String>();
        // hash.put("A", "A", "C");
        // hash.put("A", "A", "D");
        // hash.put("B", "A", "E");
        // System.out.println(hash.get("A", "A"));
        // System.out.println(hash.get("A", "B"));
        // }
}